/*
================================================================================
	Plik: f_cpse.c
--------------------------------------------------------------------------------
	Autorzy: Piotr Zdunek, Mateusz Słowikowski, Krzysztof Wiąckowski
	Projekt:Model mikrokontrolera AVR
	Kompilator: avr-gcc-4.3.5
	Doc: doxygen 1.7.4
--------------------------------------------------------------------------------
	Zawiera:
--------------------------------------------------------------------------------
	Komentarze:
================================================================================
*/

/*! \file f_cpse.c
 * \brief Plik opisujący funkcję CPSE
 */

#include "types.h"
#include "mem_abs.h"

//**********************************************
//CPSE - funkcja wykonująca skok jeśli wartość dwóch danych rejestrów jest sobie równa
//**************************************************

void F_CPSE(void){

	/*!  void F_CPSE(void){}
	 *  \n \n
	 *  CPSE - funkcja wykonująca skok jeśli wartość dwóch danych rejestrów jest sobie równa.
	 *
	 *  \ref pagecpse \n
	 */


	#ifndef  DEBUG_MODE	
		printf("Function CPSE.");
	#endif


	uint8_t Rd=(getMEMC(getPC()) & 0x00F0) >> 4;			//identyfikacja numeru rejestru arg. 1
	uint8_t Rr=(getMEMC(getPC()) & 0x000F);				//identyfikacja numeru rejestru arg. 2

	uint8_t RdMSB = (((getMEMC(getPC()) & 0x0F00) >> 8) & 0b0001)<<4;
	    Rd = RdMSB + Rd;
	Rd = RdMSB + Rd;

	uint8_t RrMSB = (((getMEMC(getPC()) & 0x0F00) >> 8) & 0b0010)<<3;
	    Rr = RrMSB + Rr;
	Rr = RrMSB + Rr;

	uint8_t Rd_val = getRegister(Rd) % MAX_DATA_VAL;		//pobranie zawartosci rejestru arg 1
	uint8_t Rr_val = getRegister(Rr) % MAX_DATA_VAL;		//pobranie zawartosci rejestru arg 2

	uint8_t Rd=(getMEMC(getPC()) & 0x00F0) >> 4;			//Identyfikacja numeru rejestru arg. 1
	uint8_t Rr=(getMEMC(getPC()) & 0x000F);				//Identyfikacja numeru rejestru arg. 2
	uint8_t Rd_val = getRegister(Rd) % MAX_DATA_VAL;		//Pobranie zawartosci rejestru arg 1
	uint8_t Rr_val = getRegister(Rr) % MAX_DATA_VAL;		//Pobranie zawartosci rejestru arg 2


//Sprawdzenie warunku równości
//jeśli prawda do skok o k
//jeśli fałsz to skok o 1
	if(Rd_val == Rr_val) incPC_k(1);
	else incPC();

}
/*! \page pagecpse Opis działania funkcji CPSE
 *
 *	CPSE - funkcja wykonująca skok jeśli wartość dwóch danych rejestrów jest sobie równa.
 *
 *	\dontinclude f_cpse.c
 *
 *	\section sec_cpse1 Wykonywane operacje
 *
 *	1. Identyfikacja numeru rejestru arg. 1:
 *	\skipline Rd
 *	2. Identyfikacja numeru rejestru arg. 2:
 *	\skipline Rr
 *	3. Pobranie zawartosci rejestru arg 1:
 *	\skipline Rd_val
 *	4. Pobranie zawartosci rejestru arg 2:
 *	\skipline Rr_val
 *	5.Sprawdzenie warunku równości, jeśli prawda do skok o ustalone k, jeśli fałsz to skok o 1:
 *	\skipline incPC_k
 *	\until incPC
 *
 *
 *	\section sec_cpse2 Kod źródłowy funkcji
 *
 *	\include f_cpse.c
 *
 */
